package cn.chainco.cts.idao;

import java.util.Date;
import java.util.List;
import java.util.Map;

import cn.chainco.cts.jdo.Company;
import cn.chainco.cts.jdo.ContainerNo;
import cn.chainco.cts.jdo.Currency;
import cn.chainco.cts.jdo.Employee;
import cn.chainco.cts.jdo.User;
import cn.chainco.cts.jdo.Work;
import cn.chainco.cts.jdo.WorkFee;
import cn.chainco.cts.jdo.WorkItem;



public interface IWorkDao extends GenericDao<Work, Long>{
	/**
	 * 获取某人在某家公司的订单的某种状态的总数
	 */
	public int getCountByStatus( Company company,User user,Employee employee,int status);
	
	/**
	 * Or查询某个人的订单或者是没有or的时候查询
	 */
	public List<Work> getWorkByOrConditions( Company company,User user,Employee employee,Map<String,String> workConditions,Map<String,String> workItemConditions,Map<String,String> workTeamConditions,Map<String,String> tagConditions,int pageSize,int pageNumber);
	
	/**
	 * And查询某个人的订单
	 */
	public List<Work> getWorkByAndConditions( Company company,User user,Employee employee,Map<String,String> workConditions,Map<String,String> workItemConditions,Map<String,String> workTeamConditions,Map<String,String> tagConditions,int pageSize,int pageNumber);


	/**
	 * 根据work获取不同类型的费用
	 */
	public List<WorkFee> getFeesByWork( Work work,int type );
	
	/**
	 * 根据work获取其他委托项目
	 */
	public List<WorkItem> getItemsByWork( Work work );
	
	/**
	 * 获取某家公司指定创建月份的订单总数
	 */
	public int getCountByCompany(Company company, Date date);

	/**
	 * 根据订单号查询订单
	 */
	public Work getWorkByWorkCode(Company company, String workCode);
	/**
	 * 添加箱量柜号
	 * @param map key是类型，value是数量
	 * @param work
	 */
	public void addBoxAmount(Map<Integer, Integer> map, Work work);
	/**
	 * 统计箱量类型数量
	 * @param work key是类型，value是数量
	 * @return
	 */
	public Map<Integer, Integer> getBoxTypeCount(Work work);
	/**
	 * 获取订单全部箱量
	 */
	public List<ContainerNo> getAllContainerNoByWork(Work work);
	/**
	 * 删除count条空的柜号
	 * @return 返回删除的条数
	 */
	public Integer delBoxByEmpty(Work work, String boxType, int count);
	/**
	 * 根据地点类型查询其它委托项目，地点类型为null查询所有
	 */
	public List<WorkItem> getWorkItemByType(Work work, Integer type);
	
	/**
	 * 根据单查询整个单的委托项目完成状态，同时更加结果算出单本身的状态
	 */
	public void updateWorkStatus( Work work);

	/**
	 * 获取某人在某家公司的订单的某种单的总数
	 */
	public int getCountByType( Company company,User user,Employee employee,String itemName );
	/**
	 * 统计订单
	 * statisticalType ：统计类型 1-统计奖励,2-统计毛利,3-统计订单
	 * conditions : 条件，统计结束后会多一个Key为workCount的总数量
	 */
	public List<Work> statisticalWorks(Company company, int statisticalType, boolean isGroup, Map<String, Object> conditions, int pageSize, int pageNumber);
	
	/**
	 * <pre>
	 * 统计订单费用，返回float数组，保留二位小数
	 * float[0]为应收费用合计，float[1]为应付费用合计，float[2]为奖励合计，float[3]为毛利润，float[4]为公司利润
	 */
	public float[] countWorkFees(Work work, Currency currency);
	/**
	 * 统计奖励费用A奖励+B奖励,并保存到字段totalReward
	 */
	public float countWorkFee(WorkFee workFee, Currency currency);
	
	/**
	 * 财务统计(应收未收应付未付)
	 * conditions : 条件，统计结束后会多一个Key为workCount的总数量
	 * statisticsType=0应收未收, statisticsType=1应付未付
	 */
	public List<WorkFee> statisticsFinancial(Company company, int statisticsType, String clientId, String months, String days, 
		String employeeId, String tag, String workingStatus, int pageSize, int pageNumber);
	
	/***
	 * 根据传入的workId更新最新的和钱有关的状态并且更新其有比例奖励的数据的
	 */
	public void updateWorkFeesStatus( long workId );
}



